package converterapp; import com.sun.glass.events.KeyEvent; import java.awt.Color; import java.awt.event.ItemEvent; import java.math.RoundingMode; import java.text.DecimalFormat; import java.text.NumberFormat; import javax.swing.JFormattedTextField; import javax.swing.JFormattedTextField.AbstractFormatter; import javax.swing.JSpinner; import javax.swing.text.InternationalFormatter; /** * * @author Azhar, Alex, Jeydan, Russel */ public class ConverterView extends javax.swing.JPanel{ /** * ConverterView mostly contains SWING code (JPanel, JFormattedText, JToggleButton, JButton etc) * It has main process of converting */ private final String[] ISUnits = {"Centimetre","Metre","Kilometre","Celcius"}; private final String[] USUnits = {"Inch","Feet","Yard","Mile","Fahrenheit"}; //private ConverterFormulas cf; /** * Creates new form ConverterView */ public ConverterView() { initComponents(); //initialize the component, see Compenent() method for more txt_sourceUnit.setFormatterFactory(new CostumeFormatter(5)); //set textfield an instance of Formatter class txt_targetUnit.setFormatterFactory(new CostumeFormatter(5)); //set textfield an instance of Formatter class } /** * This method is called from within the constructor to initialize the form. * WARNING: Do NOT modify this code. The content of this method is always * regenerated by the Form Editor. */ @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents private void initComponents() { java.awt.GridBagConstraints gridBagConstraints; jPanel2 = new javax.swing.JPanel(); lb_title = new javax.swing.JLabel(); jPanel1 = new javax.swing.JPanel(); jLabel4 = new javax.swing.JLabel(); cbox_sourceUnit = new javax.swing.JComboBox(ISUnits); cbox_targetUnit = new javax.swing.JComboBox(USUnits); btn_convert = new javax.swing.JButton(); toggleBtn_switch = new javax.swing.JToggleButton(); sp_numberAfterDecimal = new javax.swing.JSpinner(); txt_sourceUnit = new javax.swing.JFormattedTextField(); txt_targetUnit = new javax.swing.JFormattedTextField(); setLayout(new java.awt.BorderLayout()); jPanel2.setLayout(new java.awt.BorderLayout()); lb_title.setFont(new java.awt.Font("Arial Narrow", 1, 18)); // NOI18N lb_title.setHorizontalAlignment(javax.swing.SwingConstants.CENTER); lb_title.setText("Converter Application"); jPanel2.add(lb_title, java.awt.BorderLayout.CENTER); add(jPanel2, java.awt.BorderLayout.PAGE_START); jPanel1.setLayout(new java.awt.GridBagLayout()); jLabel4.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING); jLabel4.setText("Decimal Places"); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 3; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); jPanel1.add(jLabel4, gridBagConstraints); cbox_sourceUnit.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { cbox_sourceUnitItemStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 0; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.ipadx = 20; jPanel1.add(cbox_sourceUnit, gridBagConstraints); cbox_targetUnit.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { cbox_targetUnitItemStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 1; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.ipadx = 20; jPanel1.add(cbox_targetUnit, gridBagConstraints); btn_convert.setText("Convert"); btn_convert.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { btn_convertActionPerformed(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; jPanel1.add(btn_convert, gridBagConstraints); toggleBtn_switch.setText("Switch"); toggleBtn_switch.addItemListener(new java.awt.event.ItemListener() { public void itemStateChanged(java.awt.event.ItemEvent evt) { toggleBtn_switchItemStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 2; gridBagConstraints.gridwidth = 2; gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); jPanel1.add(toggleBtn_switch, gridBagConstraints); sp_numberAfterDecimal.setModel(new javax.swing.SpinnerNumberModel(5, 1, 9, 1)); JFormattedTextField tf = ((JSpinner.DefaultEditor) sp_numberAfterDecimal.getEditor()).getTextField(); tf.setEditable(false); tf.setBackground(Color.white); sp_numberAfterDecimal.addChangeListener(new javax.swing.event.ChangeListener() { public void stateChanged(javax.swing.event.ChangeEvent evt) { sp_numberAfterDecimalStateChanged(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 2; gridBagConstraints.gridy = 3; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); jPanel1.add(sp_numberAfterDecimal, gridBagConstraints); txt_sourceUnit.setColumns(20); txt_sourceUnit.setHorizontalAlignment(javax.swing.JTextField.TRAILING); txt_sourceUnit.addKeyListener(new java.awt.event.KeyAdapter() { public void keyTyped(java.awt.event.KeyEvent evt) { txt_sourceUnitKeyTyped(evt); } }); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 0; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); jPanel1.add(txt_sourceUnit, gridBagConstraints); txt_targetUnit.setEditable(false); txt_targetUnit.setFormatterFactory(new CostumeFormatter(5)); txt_targetUnit.setHorizontalAlignment(javax.swing.JTextField.TRAILING); gridBagConstraints = new java.awt.GridBagConstraints(); gridBagConstraints.gridx = 0; gridBagConstraints.gridy = 1; gridBagConstraints.gridwidth = 2; gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5); jPanel1.add(txt_targetUnit, gridBagConstraints); add(jPanel1, java.awt.BorderLayout.CENTER); }// </editor-fold>//GEN-END:initComponents private void toggleBtn_switchItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_toggleBtn_switchItemStateChanged // TODO add your handling code here: swap the source units into target units and otherwise int selectedSourceIndex = cbox_sourceUnit.getSelectedIndex(); int selectedTargetIndex = cbox_targetUnit.getSelectedIndex(); if(evt.getStateChange() == ItemEvent.DESELECTED){ cbox_sourceUnit.setModel(new javax.swing.DefaultComboBoxModel(ISUnits)); cbox_targetUnit.setModel(new javax.swing.DefaultComboBoxModel(USUnits)); } else { cbox_sourceUnit.setModel(new javax.swing.DefaultComboBoxModel(USUnits)); cbox_targetUnit.setModel(new javax.swing.DefaultComboBoxModel(ISUnits)); } cbox_sourceUnit.setSelectedIndex(selectedTargetIndex); cbox_targetUnit.setSelectedIndex(selectedSourceIndex); }//GEN-LAST:event_toggleBtn_switchItemStateChanged private void cbox_sourceUnitItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbox_sourceUnitItemStateChanged // TODO add your handling code here: to avoid choosing invalid units if(cbox_sourceUnit.getSelectedItem().equals("Celcius")){ if(!cbox_targetUnit.getSelectedItem().equals("Fahrenheit")){ cbox_targetUnit.setSelectedItem("Fahrenheit"); } } else if(cbox_sourceUnit.getSelectedItem().equals("Fahrenheit")){ if(!cbox_targetUnit.getSelectedItem().equals("Celcius")){ cbox_targetUnit.setSelectedItem("Celcius"); } } else if(cbox_targetUnit.getSelectedItem().equals("Celcius")){ if(!cbox_sourceUnit.getSelectedItem().equals("Fahrenheit")){ cbox_targetUnit.setSelectedItem("Metre"); } } else if(cbox_targetUnit.getSelectedItem().equals("Fahrenheit")){ if(!cbox_sourceUnit.getSelectedItem().equals("Celcius")){ cbox_targetUnit.setSelectedItem("Feet"); } } }//GEN-LAST:event_cbox_sourceUnitItemStateChanged private void cbox_targetUnitItemStateChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_cbox_targetUnitItemStateChanged // TODO add your handling code here: to avoid choosing invalid units if(cbox_targetUnit.getSelectedItem().equals("Fahrenheit")){ if(!cbox_sourceUnit.getSelectedItem().equals("Celcius")){ cbox_sourceUnit.setSelectedItem("Celcius"); } } else if(cbox_targetUnit.getSelectedItem().equals("Celcius")){ if(!cbox_sourceUnit.getSelectedItem().equals("Fahrenheit")){ cbox_sourceUnit.setSelectedItem("Fahrenheit"); } } else if(cbox_sourceUnit.getSelectedItem().equals("Celcius")){ if(!cbox_targetUnit.getSelectedItem().equals("Fahrenheit")){ cbox_sourceUnit.setSelectedItem("Metre"); } } else if(cbox_sourceUnit.getSelectedItem().equals("Fahrenheit")){ if(!cbox_targetUnit.getSelectedItem().equals("Celcius")){ cbox_sourceUnit.setSelectedItem("Feet"); } } }//GEN-LAST:event_cbox_targetUnitItemStateChanged private void sp_numberAfterDecimalStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_sp_numberAfterDecimalStateChanged // TODO add your handling code here: textfield set to zero when place decimal value changes, set new format to field txt_sourceUnit.setFormatterFactory(new CostumeFormatter(Integer.parseInt(sp_numberAfterDecimal.getValue().toString()))); txt_targetUnit.setFormatterFactory(new CostumeFormatter(Integer.parseInt(sp_numberAfterDecimal.getValue().toString()))); double sourceValue = Double.parseDouble(txt_sourceUnit.getValue().toString()); double targetValue = Double.parseDouble(txt_targetUnit.getValue().toString()); txt_sourceUnit.setValue(sourceValue); txt_targetUnit.setValue(targetValue); }//GEN-LAST:event_sp_numberAfterDecimalStateChanged private void btn_convertActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btn_convertActionPerformed // TODO add your handling code here: converting process takes place below this line String sourceUnit = cbox_sourceUnit.getSelectedItem().toString().toLowerCase(); //get text from selected item from comboxbox with lower case char String targetUnit = cbox_targetUnit.getSelectedItem().toString().toLowerCase(); //get text from selected item from comboxbox with lower case char Formulas f = new Formulas(Double.parseDouble(txt_sourceUnit.getValue().toString())); //input the value into object "f" double value = f.getValue(sourceUnit, targetUnit); //get converted value txt_targetUnit.setValue(value); //set value to target textfield }//GEN-LAST:event_btn_convertActionPerformed private void txt_sourceUnitKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_txt_sourceUnitKeyTyped // TODO add your handling code here: converting process by pressing enter key if(evt.getKeyChar() == KeyEvent.VK_ENTER){ String sourceUnit = cbox_sourceUnit.getSelectedItem().toString().toLowerCase(); String targetUnit = cbox_targetUnit.getSelectedItem().toString().toLowerCase(); Formulas f = new Formulas(Double.parseDouble(txt_sourceUnit.getValue().toString())); double value = f.getValue(sourceUnit, targetUnit); txt_targetUnit.setValue(value); } }//GEN-LAST:event_txt_sourceUnitKeyTyped // Variables declaration - do not modify//GEN-BEGIN:variables private javax.swing.JButton btn_convert; private javax.swing.JComboBox cbox_sourceUnit; private javax.swing.JComboBox cbox_targetUnit; private javax.swing.JLabel jLabel4; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JLabel lb_title; private javax.swing.JSpinner sp_numberAfterDecimal; private javax.swing.JToggleButton toggleBtn_switch; private javax.swing.JFormattedTextField txt_sourceUnit; private javax.swing.JFormattedTextField txt_targetUnit; // End of variables declaration//GEN-END:variables class CostumeFormatter extends JFormattedTextField.AbstractFormatterFactory { /** * CostumeFormatter is costume class which extends from AbstractFormatterFactory * CostumeFormatter sets number format, min & max decimal places, rounding decimal method */ private int maximumFractionDigits; // max decimal place stores CostumeFormatter(int maximumFractionDigits){ //construction with initial max place this.maximumFractionDigits = maximumFractionDigits; } @Override public AbstractFormatter getFormatter(JFormattedTextField tf) { NumberFormat format = DecimalFormat.getInstance(); // format.setMinimumIntegerDigits(0); format.setMinimumFractionDigits(1); //set minimum decimal place format.setMaximumFractionDigits(maximumFractionDigits); //set maximum decimal place format.setRoundingMode(RoundingMode.HALF_UP); //set rounding decimal method InternationalFormatter formatter = new InternationalFormatter(format); formatter.setAllowsInvalid(false); return formatter; } } }